Version 7.0 Alpha Upgrade - #9613
Merged
Merged
Conversation
Keep Call Saved Workflow roots eligible during child waits.
… counter - The adapter-wide PDH counter cannot be used: measured with an 8 GiB holder, the holding process read 15.66 GiB and another read 0.176 GiB for the same instance at the same moment. It also shares the driver's basis, so subtracting torch's live figure invented ~2 GiB of foreign residency after every load/unload cycle - The ceiling is min(total, max(budget, our CurrentUsage)): a budget below our own residency asks this process to trim itself, which the cache does for the reservation. A foreign holder that leaves the budget alone is documented as undetectable - One PDH query per counter, per-item CStatus checked, usage clamped rather than dropped with the budget - Interpolate decode peaks in bytes so a smaller image is never priced above a larger one
Moving items onto Uncategorized now uses the same drop path as named boards.
User-facing copy, counts and the layer save action now say Uploads.
Arrow-key navigation and scroll-to-session follow the new starred, in-progress, listing order.
Modified Enter/Space no longer stops at the tile or starts a keyboard drag.
Selected tiles, including in-progress ones, get a shared inset accent ring.
Unselected line-tab triggers use the ghost-button hover tint.
Invalid form controls and drop zones tint red on hover instead of repainting a neutral border.
Label and value stay legible over the fill.
The form draft lives in an external store read per section; generate values are exposed as a store with narrow selectors.
The rail becomes route links in visual order: Workspace, open projects, Manage; entries show a leave arrow on hover.
Set a thumbnail from the gallery or an upload, or remove it; the mock backend serves the thumbnail routes.
… add FLUX.1 The widget accepted only SD1.5 and SDXL, and its compiler threw without a tile ControlNet, so an architecture without one could not reach it. A capability table now says what each architecture has; the compiler builds the shared prefix once and dispatches to a per-architecture builder that `satisfies` the same keys. FLUX.1 gets a builder: both VAE ends tile, and the frame is fitted to the grid `flux_denoise` accepts, because Spandrel rounds to 8 and the node demands 16. Structure, the tile ControlNet picker and the negative prompt are hidden where nothing consumes them; T5, CLIP and VAE are required where the loader needs them.
Update the reconnect viewport seed and cover a lone off-screen call-workflow node.
Folders are identified by their scaling/shift constants and single files by an explicit base, then the backbone their name or install source states; adds FLUX.1-diffusers and SD3 VAE configs, and an override now decides within a latent family instead of being overruled. VAELoader loads SD3 single files in either layout, FLUX.1 folders outside float16, and flat VAE folders requested as SubModelType.VAE. Reidentify passes the stored install source, so name evidence survives a re-probe.
Restore workflow editor viewport after preview
Resolve selected-branch iteration paths in If runtime handling and document direct output_collection consumers.
test: keep the nvfp4 loader forwards off torch's CPU bf16 GEMM
docs: reorganize for v7 with prefix-ordered sidebar and new Users Guide pages
…-gaps Moves the quantized formats to Model Formats and Families, model identification under Advanced Topics, and the Ideogram 4 and ERNIE-Image additions to their new per-family pages. Points the Ideogram 4 requirements link at its page and sorts Upscaling after Intermediates.
fix(webv2): darken success and warning toast fills for AA contrast
…indows-memory Carries the branch's low-VRAM docs and regenerated API contracts to their moved locations under configuration/Optimization and frontend/api.
Carries the branch's regenerated API contracts to their moved location under frontend/api.
docs: document model, quantization and upscale changes from recent PRs
fix(z-image): hold the schedule shift at the end of its fit
Keeps the corrected force_tiled_decode description next to auto_tiled_decode and regenerates the API contracts. Folds the automatic-tiling docs into the existing Tiled VAE decode and encode section and fixes the moved page's system-requirements link.
…-2.13 Keeps the CUDA or Intel XPU requirement and drops the CUDA 12.x mention from the FP8 Storage page, and regenerates the API contracts.
ROCm on Windows: keep VRAM resident and bound attention and VAE memory
…-2.13 Regenerates the API contracts with both noise_dtype and the ROCm memory settings.
chore(deps): move the cpu and cuda extras to torch 2.13.0 (cu130)
new image by @JPPhoto
This was referenced Oct 1, 2026
lstein
marked this pull request as ready for review
October 2, 2026 00:15
6 of 7 tasks
2 of 5 tasks
joshistoast
added a commit
that referenced
this pull request
Oct 2, 2026
## Summary Two community finetunes of Anima now install and generate correctly: [Anima-2.9B](https://huggingface.co/Gazingstars123/Anima-2.9B) and [Anima-3.8B](https://huggingface.co/lylogummy/Anima-3.8B). **Anima-2.9B** (40 DiT blocks instead of 28) already installed as Anima, but the loader built the transformer from a hard-coded 28-block config and loaded with `strict=False`. It filled the first 28 blocks and dropped the other 12 (240 tensors) as unexpected keys, logged at DEBUG only. The result was a degraded image and no error. The loader now reads the depth from the checkpoint and refuses gaps. The int8_tensorwise build from the same repo loads too, through `install_int8_convrot_layers`. **Anima-3.8B v1.1** (52 blocks) bundles a "semantic connector" into its checkpoint that reads a second text encoder, Qwen3.5 4B. The connector is timestep-aware, so its context changes at every step. Until now the checkpoint installed as Anima, loaded 28 blocks and dropped the connector. Now: - `AnimaVariantType` (`anima_qwen3`, `anima_qwen35`), detected from the bundled `anima_v2_connector.*` keys - new `ModelType.Qwen35Encoder` (`qwen3_5_encoder`): single-file config and loader built on the `transformers` `qwen3_5` decoder layers, with the tokenizer vendored from `Qwen/Qwen3.5-4B` @ `851bf6e` (Apache-2.0). The encoder checkpoint is not a stock export: it ships layer 31 without its MLP, and the encoder reproduces that exactly. - a port of the connector (`invokeai/backend/anima/semantic_connector.py`), whose module names match the checkpoint - **Prompt - Anima** encodes Qwen3.5 when its new optional input is connected. **Denoise - Anima** recomputes the connector context at every step, for the positive, the negative and every regional conditioning, with a float32 sigma. The connector scales sigma by 1000 before embedding it, and bf16 rounding would shift its high frequencies. - webv2: a **Qwen3.5 Encoder** slot shown only for the `anima_qwen35` variant, plus graph, regional guidance and recall wiring - the earlier Anima-3.8B v1.0 transformer, which needs a separate adapter file, is refused at install with an `InvalidMatchError` that names v1.1 **LoRAs and ControlNet-LLLite adapters.** Both finetunes insert their new blocks between the original ones, so an adapter trained on Anima patched different blocks from the third one on. Measured from the checkpoints: - Anima-2.9B holds all 28 blocks of Anima base-v1.0 bit for bit, with its 12 new blocks at 2, 5, 8, …, 36. - Anima-3.8B holds the 40 blocks of 2.9B nearly unchanged (cosine similarity ≥ 0.9997, 11 bit-identical), with 12 new blocks at 3, 7, …, 47. `invokeai/backend/anima/block_layout.py` records the tables. A LoRA's DiT keys and an LLLite adapter's bindings now move to the blocks of the model they were trained on: Anima adapters on 2.9B and 3.8B, and 2.9B adapters on 3.8B. The adapter's depth is read off the highest block it addresses. Also included: - starter models for both finetunes (2.9B bf16 and int8, 3.8B v1.1) and the Qwen3.5 encoder, with the non-commercial license noted - the Anima user guide page - three additions to `new-model-integration.mdx`, from the gaps this change hit: - a new section, *Extending an existing architecture* - a section on persisted records and migrations - corrections to the webv2 checklists <!-- Screenshots: the Components section with the Qwen3.5 Encoder slot for Anima-3.8B, and sample outputs. --> ## Related Issues / Discussions - Builds on #9613 (merged). - #9506 (Anima prompt weighting) still targets the v6 path `invokeai/app/invocations/anima_text_encoder.py`. In v7 the node lives at `invokeai/app/invocations/text_encoder/anima_text_encoder.py`, and this PR changes it as well: the new Qwen3.5 input, and the conditioning fields it stores. #9506 needs a v7 port either way, and that port picks up this file. - Reference implementation: [GumGum10/comfyui-anima-3-8B](https://github.com/GumGum10/comfyui-anima-3-8B) (MIT). ## QA Instructions **Automated** - `uv run pytest -n 8 tests/backend/model_manager tests/backend/architectures tests/backend/anima tests/backend/qwen3_5 tests/backend/util tests/backend/patches tests/app/invocations tests/app/services/shared tests/app/services/model_records tests/test_package_data.py`: 6254 passed, 1 failed. The failure, `test_16_channel_vae_loader.py::test_an_ldm_layout_file_is_converted_and_loses_no_tensor`, reads an LFS fixture that was not pulled in the test worktree; it is unrelated. - `ruff check .` and `ruff format --check .`: clean. - webv2: `lint:tsc`, `lint:oxc`, `format:check` and `architecture:check` pass. Vitest over `src/features/generation`, `src/workbench`, `src/features/models` and `src/features/workflow`: 7277 passed, 2 failed. Both failures are in image-map (`clusterStats`, `indexProgress`) and come from German-locale digit grouping on the test machine; unrelated. - Regenerated: `openapi.json`/`schema.ts`, the capabilities fixture, and the graph-coverage snapshot. The docs build passes, and `check-docs-data` shows no diff. **After review** - **Startup import:** the prompt node imports the Qwen3.5 encoder where it runs, not at module level. That spares every app start transformers' `qwen3_5` modeling module, about 0.25 s. A subprocess test fails on the previous module-level import. - **Migration on real databases:** the full chain ran on copies of three populated databases, using `init_db` as the app does, and every model record read back afterwards. - A v7 dev root with Anima base, preview and a tcfp8 build: all three became `anima_qwen3`. - A v7 dev root with Anima base fp8: it became `anima_qwen3`. - The production database of a v6 install, 69 MiB with 75 models: the chain ran in 0.3 s and all 75 records read back. It holds no Anima main model. - Two Ideogram-4 GGUF records from another branch's build were invalid before and after; they are unrelated. - **FP8 Storage and the connector's timestep path** (Anima-3.8B, 832×1216, 30 steps, three seeds; every run fully resident and bit-reproducible): | | PSNR against bf16 | |---|---| | timestep path kept in bf16 (the previous exception) | 8.4 / 10.3 / 9.6 dB | | everything in FP8 | 8.4 / 10.2 / 9.6 dB | | whole connector in bf16 | 8.3 / 10.1 / 9.6 dB | | Anima base, FP8 against bf16 | 15.9 / 15.2 / 14.0 dB | The exception changed nothing measurable and cost 152 MiB (159M parameters), so it is gone. FP8 Storage changes Anima-3.8B's composition through its DiT blocks, not the connector; the user guide now says so. - **LLLite through the block layout** (`anima-lllite-any-test-like-v2`, trained on Anima). Control: a grayscale render. Prompt: different content. The metric is the edge correlation between output and control: | | no adapter | adapter by index (before) | adapter on the kept blocks (now) | |---|---|---|---| | Anima base | 0.126 | 0.451 | 0.451 | | Anima-2.9B | 0.121 | 0.187 | 0.474 | | Anima-3.8B | 0.081 | 0.106 | 0.421 | By index, the finetunes all but ignored the adapter; on the kept blocks they follow it as Anima base does. The LoRA path shares the tables and is unit-tested (key moves, untouched LLM adapter and text encoder keys, cached LoRA not modified); no Anima LoRA was available locally for an end-to-end run. <!-- Screenshots: LLLite before/after sheet, FP8 Storage sheet for Anima-3.8B. --> **Numerical checks against the reference implementation, on the real weights** - Qwen3.5 encoder, fp32: relative L2 ~1.5e-6 at layers 7/15/23/31, for 27- and 114-token prompts. In bf16 the error is ~1e-2, the same as the reference's own bf16 error. - Connector: bit-identical (relative L2 0.0) at sigma 1.0, 0.75, 0.3 and 0.02. An empty prompt (one masked Qwen3.5 token) also matches the reference, on both the math and the efficient SDPA backends. **End to end**: RTX 4090, fresh root, models installed in place through the API, 832×1216, 30 steps, Euler, seed 1234. | Model | Result | | --- | --- | | Anima Base 1.0 | unchanged (regression check) | | Anima-2.9B bf16 | coherent, all 40 blocks loaded | | Anima-2.9B int8 | nearly identical to bf16; 640 of 640 layers kept int8, 2.9 GB in VRAM instead of 5.6 GB | | Anima-3.8B v1.1, CFG 6 | coherent, with clearly better spatial and object binding | | Anima-3.8B, empty negative prompt | coherent | | Anima-3.8B without a Qwen3.5 encoder | refused by the model loader with a message naming the missing encoder | Speed, single runs only (not a benchmark): ~1.7 it/s for 2.9B against ~1.3 it/s for 3.8B, which also runs the connector every step. **Browser** (built webv2 against the same server): - The Qwen3.5 slot appears only when Anima-3.8B is selected. Invoke stays disabled until both encoders are chosen. - Generation works, and the image metadata records `qwen3_5_encoder`. - **Reset all to model defaults** sets 40 steps / CFG 6, the settings of the author's reference workflow. ## Review Remaining risks and limitations: - The block layout tables are keyed by depth (40, 52). These are the only depth-expanded Anima models today. A future finetune with one of these depths but another layout would need its own entry. - An adapter's own depth is read off the highest block it addresses. An adapter trained on Anima-2.9B that addresses only blocks below 28 would be taken for an Anima adapter. - On Anima-3.8B, the blocks an Anima adapter lands on were changed slightly, and the semantic connector conditions every block. Adapters work there (see the LLLite table), but results can differ more than on 2.9B. - The reference masks every Qwen3.5 token from the first id 151643 on. That id is the Qwen3 padding token, but in Qwen3.5's vocabulary it is the ordinary token " 내용". This behavior is not reproduced; empty prompts behave like the reference. - The author's workflow samples with `res_multistep` and a beta schedule, which Anima's scheduler set does not offer. - The int8 path is new for Anima and has been validated on the Anima-2.9B int8 file only. ## Compatibility / Rollout - **Migration** `2026_10_01_add_anima_variant` (depends on `2026_09_26_add_workflow_revision`): `variant` is now a required field on Anima main records. Without the migration, every installed Anima model would fail validation on read and vanish from the model list. The migration reads each checkpoint's header, so a 3.8B installed on an earlier v7 build becomes `anima_qwen35`. A record whose file cannot be read gets `anima_qwen3`. - **New persisted values**: model type `qwen3_5_encoder`, variants `anima_qwen3`, `anima_qwen35` and `qwen3_5_4b`. - **Node versions**: `anima_model_loader` 1.5.0 and `anima_text_encoder` 1.5.0. The new inputs and outputs are optional, so existing workflows keep validating. - **Packaging**: `invokeai.backend.qwen3_5` is added to `package-data`. A new `tests/test_package_data.py` checks that every vendored `*.json`/`*.json.gz` under `invokeai/backend` ships in the wheel. ## Checklist - [x] _The PR has a short but descriptive title, suitable for a changelog_ - [x] _Meaningful regression coverage added / updated where needed; obsolete tests/code removed_ - [x] _Persisted-state and API changes include required migrations / compatibility validation_ - [x] _Relevant performance/efficiency opportunities considered; material claims have evidence_ - [x] _Material review findings resolved and relevant checks rerun_ - [x] _Documentation added / updated (if applicable)_ - [ ] _Updated `What's New` copy (if doing a release after this PR)_
joshistoast
added a commit
that referenced
this pull request
Oct 2, 2026
…te (#9644) ## Summary This brings back the "What's New" notes from 6.14.2 and earlier in the v7 (webv2) UI, redesigned around the v7 highlights, and makes the UI show the real release version instead of a hard-coded `7.0`. - **What's New dialog.** A larger dialog led by the v7 logo, the title and a server-version badge. Headline features show as icon cards (`whatsNew.highlights`: redesigned interface, projects, rebuilt Canvas, expanded model support), with the remaining notes listed under "Also in this release" (`whatsNew.items`). **Read the Docs** and **Read Release Notes** (`releases/tag/v<server version>`) are footer buttons. The `<StrongComponent>` emphasis from 6.14 is gone; card titles carry that emphasis now. - **Automatic first-run showing.** The dialog opens on its own once per server version for each account. It waits until the account's workbench preferences have loaded and the alpha notice has been dismissed, so the two never stack. Dismissing it stores `whatsNewSeenVersion` in the account's preferences. - **Lightbulb button.** A lightbulb sits in the app menu footer, between Settings and Documentation. It uses the same Phosphor `LightbulbFilament` (bold) glyph as 6.14.2, vendored into `VendoredIcon.tsx` because webv2 doesn't depend on react-icons. - **Launchpad entry.** The launchpad has no app menu, so its sidebar footer gets a "What's New in Invoke" action with the same lightbulb, between Preferences and Help and resources. - **Home in the Invoke menu.** The editor's Invoke menu gains a **Home** item, with the launchpad's house icon, above the Manage group. - **App version.** `APP_VERSION` was hard-coded to `'7.0'` and went stale (the server is `7.0.0-rc1`). Vite now reads `__version__` from `invokeai/version/invokeai_version.py`, the same file the release workflow checks against the tag. The splash screen, app menu, Help menu, `.invk` export manifest, and diagnostics and log exports all show the real version. The release process still bumps only that one file. - **Docs link.** The app-menu Documentation icon and the launchpad Help → Documentation entry now point to https://invoke-ai.github.io/InvokeAI-7/. ### Implementation notes - **Where the server version lives.** The server version is kept in `whatsNewStore`, not in the TanStack query cache. The gate mounts above the router, and account transitions call `queryClient.clear()` without remounting it. A query-backed version therefore never arrived in the real app, even though the unit tests passed. The version is loaded from the authenticated route's `beforeLoad`, and opening the dialog from the menu retries it. - **Closing before the version loads.** A manual close sets a dismissed flag for the rest of the page load. Without it, a version that arrived late would reopen notes the user had just closed. - **Initial focus.** Focus starts on the dialog panel. An automatic open has no click behind it, so focusing the first link would have drawn a keyboard focus ring on it. - **Highlights catalog.** Each card's icon is paired with its `whatsNew.highlights.<key>` entry in `WhatsNewDialog.tsx`, so adding a headline feature means adding both. The browser test fails if a catalog highlight has no card. - **Build-time version.** The version is injected as `import.meta.env.APP_VERSION`, not as a global `__APP_VERSION__` define: Vitest browser mode re-encodes string globals, so they arrive wrapped in an extra pair of quotes. The build fails if the version file is missing or its `__version__` line can't be parsed; there is no fallback. - **Startup bundle.** `appMetadata`, `whatsNewStore` and `useWhatsNew` join `ROUTE_SHARED_MODULES`, so startup request counts stay at the baseline. The build and browser baselines are re-recorded for those three modules entering the startup graph (measured cost under QA Instructions). The baseline's image-byte drop comes from main's assets changing since the 2026-09-29 capture. The 113 KB logo loads only when the dialog opens. - **Translation-key test.** `translationKeys.test.ts` now treats an array's own path as a key, because arrays are read whole with `returnObjects`. - **Test fixtures.** The mock backend seeds `whatsNewSeenVersion` so journeys don't open on the dialog, and the topbar-menu accessibility journey includes the new footer item in its keyboard order. ## Related Issues / Discussions Follows #9613 (InvokeAI 7 alpha); the highlights are drawn from its release notes. ## QA Instructions - `pnpm lint` (format, oxlint, tsc, architecture): passes. - `pnpm test`: 9290 passed. - `pnpm test:browser`: all files pass, including `WhatsNewDialog` tests for: - automatic open, persisting the version on dismissal, and alpha-notice gating; - every catalog highlight and note rendering; - manual open, which writes nothing; - a late version after a manual close; - a new account seeing the notes again; - initial focus. - `pnpm test:accessibility`: all 17 journeys pass. - `pnpm test:performance:build` (`check-architecture-performance.mjs`): passes. - `pnpm test:performance:browser`: passes after re-recording the browser baseline for the three What's New boot modules. Startup scripts grow by 4.8 KB on the launchpad and 7.5 KB in the editor, and other assets by 1.2 KB (mostly the English catalog), with no new requests. The editor's image bytes drop by 112 KB because the previous capture predates main's asset changes. The 113 KB logo is not loaded at startup. - App version: `APP_VERSION` is `7.0.0-rc1` in Node Vitest, browser Vitest, `vite dev` and the production bundle. A build in the Docker stage's directory layout succeeds, and fails with a clear error when the version file is missing or malformed. - Not run: the Docker image build itself. - In a browser against the mock backend (dark and light themes; 1440×900 and 1280×720): - the dialog opens automatically for an unseen version and has no focus ring; - after dismissing it and reloading, it stays closed; - the menu button opens it; - Tab reaches the footer links and Esc closes it; - at 1280×720 the body scrolls under a fixed header and footer. ## Review No material findings remain. Remaining limitations: - **Tab with an outdated version.** A tab left open since before an upgrade pushes its whole preference document whenever any setting changes. That can roll `whatsNewSeenVersion` back, so the notes show once more. Every preference already behaves this way. - **Late version.** If the version request is slow, the notes can appear on top of another dialog that is already open. - **Settings-load fallback.** When the backend settings load fails and local settings are used instead, the dialog can close and reopen on navigation. - **Dev builds.** The release-notes link points to a tag that doesn't exist on development builds. - **Anima models.** The "Expanded model support" card mentions larger Anima models, which have not merged yet. ## Compatibility / Rollout - **Docker.** The web-builder stage now mirrors the repository layout (`/build/invokeai/frontend/webv2` plus `/build/invokeai/version/invokeai_version.py`), and the final stage copies `dist` from the new path. - **Builds outside the repository.** A webv2 build without `invokeai/version/invokeai_version.py` two directories up now fails. The wheel script, CI workflows and Dockerfile all build inside the repository layout. ## Checklist - [x] _The PR has a short but descriptive title, suitable for a changelog_ - [x] _Meaningful regression coverage added / updated where needed; obsolete tests/code removed_ - [ ] _Persisted-state and API changes include required migrations / compatibility validation_ - [x] _Relevant performance/efficiency opportunities considered; material claims have evidence_ - [x] _Material review findings resolved and relevant checks rerun_ - [x] _Documentation added / updated (if applicable)_ - [x] _Updated `What's New` copy (if doing a release after this PR)_ 🤖 Generated with [Claude Code](https://claude.com/claude-code)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
InvokeAI 7 Alpha
Important
Heads up before you upgrade: v7 needs Python 3.12, the new UI is the default (the old one is still there with
--web-legacy), and the database migrations only go one way. Invoke backs up your database first. Details are in Compatibility / Rollout.Summary
Okay. This is InvokeAI 7.
It's been a lot of work. I could try to list everything that changed, but you'd be scrolling until next Tuesday. So instead, here are the three ideas that got this whole thing started.
🗂️ Projects, so you can wander off and come back
I wanted to be able to start something new without the nagging feeling I was about to lose the thing I was working on before. So now everything lives in a project: your canvas, your settings, your workflows, your queue history, and a board of its own for everything it makes.
Keep a few open as tabs. Close one and go do something else. Come back next week from the new Launchpad and it's right where you left it.
It autosaves! Edits go to your browser first and then sync to the server. That means losing wifi, a crashing tab, or the same project open in two windows won't mean the end for your recent work. If the client/server versions end up disagreeing, you'll get both. Workflows belong to their project now, with their own undo history, and you can export the whole project as an
.invkfile- and carry it over to another machine, or just for safe keeping.⚡ One page shell
Previously, each set of curated features were divided effectively into separate pages with a load screen in between, but that's history. v7 is a single workbench built out of widgets: Generate, Canvas, Gallery, Preview, Workflows, Video, Upscale, Image Map, etc. Drag them where you like, flip between layout presets, pop one out into its own floating window, or just hit Mod+K and type what you want.
And we wanted it fast, and staying fast. Widgets don't load until you open them. Every page has a budget for how much it downloads and how many requests it makes, and CI will flatly refuse a PR that goes over. Nothing gets heavier unless someone decides it should. We're a little smug about this one, and when you try it I think you'll see why.
🎨 A canvas you can actually paint on
The old canvas was built on Konva, and it was great at what it was built for: inpainting. We wrote our own engine from scratch because we wanted real, unrestrained, fast image editing, with generation built right in.
So: layer groups (nest away), 16 blend modes, non-destructive adjustments, and a layers panel that still holds up at 2,000+ layers, and you can drive it entirely from the keyboard. There's a pressure-sensitive brush, marquee and lasso selections, gradients, shapes, a text tool that takes your own fonts, a magnifying color picker, and click-to-select objects. You also get a proper history panel you can scrub back through, PSD export for when your art needs to go meet Photoshop, and much more in the future to come.
Inpainting, regional guidance, control layers and staging are all still there, living in the same document as everything else.
Those three are why we started. Then, well... it kept going. There's new video generation models (MiniMax H3, LTX-2.5), a rebuilt gallery with semantic search and a zoomable Image Map of everything you've ever made, a modernized workflow editor with loops and batch generators, a reworked execution engine, a pile of new models and quantization formats, and hundreds of fixes. The rest is below. Go poke at it! 🎉
🔍 The rest of the tour
🎬 Video, now with sound
There's a whole Video panel now, with its own prompt, a built-in Video layout (Alt+3) and a Launchpad tile to get you there. It reshapes itself around whichever model you pick, and if Invoke is greyed out it tells you why.
<Video 1>/<Picture 1>badge you can use in your prompt), and turbo LoRAs get it done in 4–8 steps. LTX-2.5 does stereo audio too, plus two-stage upscale-and-refine to 1536p, audio→video and video→audio, first/last-frame keyframes, interpolation and extend..mov, HEVC and ProRes get converted to H.264 MP4 on the way in, and audio files become waveform videos. Gallery thumbnails skip fades and title cards to find a frame that's worth looking at.🖼️ A gallery that knows what's in it
🧩 Workflows, with loops
For/ForReturnloops. Loop over a collection while carrying state between iterations, stop early, nest loops, and resume after a restart. They come with newConcat,ZipandCartesiancollection nodes.Ifand batch generators all got a round of fixes. You can also export a workflow as a PNG.🧠 Models, quantization & GPUs
The headline models are MiniMax H3 and LTX-2.5, both new in v7. On top of that, a lot of work went into making the models you already have smaller, faster and less likely to fall over:
✨ And a bunch more
📈 By the numbers
320
pull requests2,607
commits5,684
files touched+771k
lines added88k
lines of new Python tests%%{init: {"pie": {"textPosition": 0.75}} }%% pie showData title Where the new lines went (thousands) "webv2 frontend" : 508 "Tests" : 88 "API, services & invocations" : 87 "Inference & model management" : 29 "Build, tooling & other" : 32 "Docs" : 3xychart-beta title "PRs merged per week" x-axis ["Jun 29", "Jul 6", "Jul 13", "Jul 20", "Jul 27", "Aug 3", "Aug 10", "Aug 17", "Aug 24", "Aug 31", "Sep 7", "Sep 14", "Sep 21", "Sep 28"] y-axis "PRs" 0 --> 60 bar [5, 0, 4, 6, 8, 14, 21, 37, 36, 29, 40, 40, 56, 24]timeline title Three months of v7 June : v7 begins (#2) : Gallery progress and intermediates July : i18n, reference images : The new canvas lands (#9) : Upscale widget, command palette : State architecture rebuilt : Dynamic prompts and wildcards August : Launchpad home screen, .invk projects : Image Map and semantic search : Floating widget windows : MiniMax H3 video and the Video panel : Generate panel redesign September : Canvas overhaul with layers panel and editor panes : Execution engine refactor : fp8, nvfp4 and MXFP8 quantization : LTX-2.5 video with audio : Project-owned workflows, intermediates manager : webv2 becomes the defaultCompatibility / Rollout
Warning
There's no downgrade path. Migrations are one-way, and older builds refuse a database that has migrations they don't know about. Invoke writes
<db>_backup_<timestamp>.dbbefore migrating; restore that file to go back.>=3.12,<3.13(3.11 dropped)py3.11required status checks--web-legacyserves the old UI, and--webv2remains as an aliasinvokeai.frontend.web→invokeai.frontend.webv1. OpenAPI and typegen moved toinvokeai/frontend/apimigration_33(image subfolder moves) moved tomigration_34, and the fork's projects table took 33. Repair migrations cover databases that already ran upstream's 33db_synchronous,fp8_compute,image_index_*,fonts_*.force_tiled_decodenow also applies to FLUX.1umap-learn,scikit-learnandnumba. The ROCm extra moves to torch 2.13 + ROCm 7.2uv sync/projects,/image_map,/intermediates,/fonts,/wildcards,/recall/videoand/api/v2/models/capabilitiesendpoints. Workflow records gainrevision412to clients too old to open a projectMerge strategy: please use a merge commit, not a squash, so the 2.6k commits keep their history and authorship.
gitGraph commit id: "v6.14" branch v7 checkout v7 commit id: "webv2 + canvas" checkout main commit id: "upstream work" checkout v7 merge main id: "syncs ×13" commit id: "video, projects, Image Map" checkout main merge v7 id: "InvokeAI 7 🎉"Checklist
What's Newcopy (if doing a release after this PR)💜 Credits
Remarkably, v7 came from four people, 320 PRs and more late nights and all-nighters than we'll admit to.
@joshistoast
@lstein
@Pfannkuchensack
@JPPhoto
Huge thanks to everyone who tested early builds and told us what was broken.